home *** CD-ROM | disk | FTP | other *** search
- // DeviceSelect.c
- // 09 Jun 1996 12:40:19
-
- #ifndef BACKUP_INCLUDE
- #include "IncludeAll.c"
- #endif
- #include "Backup.h"
- #include <gadgets/NoteBook.h>
- #include <gadgets/ALVGadget.h>
- #include "DeviceSelect.h"
- #include "Backup_proto.h"
- #include "BackupStrings.h"
-
- // #define d(x) x
- #define d(x) ;
-
-
- static void BuildDeviceSelect(short Exclude0, enum DevSelExclude Exclude, struct DevSel *ds);
- static int DSCompare(const struct DSList *Dsk1, const struct DSList *Dsk2);
- static short FindDskIndex(const char *Name);
- static void NewDS(struct DevSel *ds, ULONG NewIndex);
- static ULONG __interrupt __saveds LVShowDevice(struct Hook *HookPtr,
- struct DSList *DevNode, struct LVDrawMsg *Msg );
- static BOOL isDiskDeviceName(const char *DevName);
-
-
- // aus Backup.c
- extern struct DiskFlags __far *Disks; // Laufwerks-Liste
- extern unsigned short NDisk; // Anzahl Einträge in Disks[]
-
- // aus StringGadgets.c
- extern struct Hook StrGadEditHook;
-
- // aus Backup_Options.c
- extern struct TagItem DS_GTLV_MoreTags[];
-
- // aus Backup_Window.c
- extern struct Screen *WBScreen;
-
-
- static UWORD __chip NoDriveImageData[] =
- {
- 0x8001,0x6006,0x1008,0x0810,0x0660,0x0180,0x0180,0x0660,0x0810,0x1008,0x6006,0x8001
- };
-
- static UWORD __chip TapeDriveImageData[] =
- {
- 31710,40569,32769,36833,36897,48145,48697,46633,48697,39937,32769,32766
- };
-
- static UWORD __chip DiskDriveImageData[] =
- {
- 65528,49176,49176,49176,49176,49176,49176,65528,57592,59512,59512,65528,0,0,0,
- 0,16352,16352,16352,0,7936,5120,5120,0,0,0,0,0,0,0,0,0,0,0,0,0
- };
-
- #define MAX_IMAGE_WIDTH 16
- #define MAX_IMAGE_HEIGHT 12
-
- static struct Image NoDriveImage = { 0, 0, 16, 12, 1, NoDriveImageData, 1, 0, NULL };
- static struct Image TapeDriveImage = { 0, 0, 16, 12, 1, TapeDriveImageData, 1, 0, NULL };
- static struct Image DiskDriveImage = { 0, 0, 13, 12, 3, DiskDriveImageData, 7, 0, NULL };
-
-
- struct Hook LVShowDeviceHook =
- {
- { NULL },
- HookEntry,
- (ULONG (*)()) LVShowDevice,
- NULL
- };
-
-
- static short LVTabs[] = { 100, 170, 250, 300, ~0 };
-
- static struct DSList *DskPtr = NULL;
- static struct Window *DSWin;
- static ULONG MarkedIndex;
- static ULONG MaxIndex; // Anzahl Einträge in DskPtr
- static struct MinList DriveList;
-
- static struct BInputHandler *DSInput = NULL;
-
-
- BOOL SetupDeviceSelect(short SelectedIndex, short Exclude0, enum DevSelExclude Exclude, struct DevSel *ds)
- {
- BuildDeviceSelect(Exclude0, Exclude, ds);
-
- SetSelectedDevice(SelectedIndex, ds);
-
- // Abstand im ListView so festlegen, daß mindestens 1 Zeile zwischen den Images frei bleibt
- DS_GTLV_MoreTags[0].ti_Data = max(0, (1 + MAX_IMAGE_HEIGHT) - WBScreen->Font->ta_YSize);
-
- return TRUE;
- }
-
-
- BOOL RebuildDeviceSelect(short SelectedIndex, short Exclude0, enum DevSelExclude Exclude, struct DevSel *ds)
- {
- NB_SetGadgetAttrs(*(ds->dsl_ListView), *(ds->dsl_NoteBook),
- GTLV_Labels, ~0,
- GTLV_Top, 0,
- TAG_END);
-
- BuildDeviceSelect(Exclude0, Exclude, ds);
-
- SetSelectedDevice(SelectedIndex, ds);
-
- NB_SetGadgetAttrs(*(ds->dsl_ListView), *(ds->dsl_NoteBook),
- GTLV_Labels, &ds->dsl_List,
- TAG_END);
-
- return TRUE;
- }
-
-
- static void BuildDeviceSelect(short Exclude0, enum DevSelExclude Exclude, struct DevSel *ds)
- {
- short m, n;
-
- CleanupDeviceSelect(ds);
-
- NewList((struct List *) &ds->dsl_List);
-
- ds->dsl_DskPtr = calloc(sizeof(struct DSList), NDisk);
- if (NULL == ds->dsl_DskPtr)
- {
- alarm(GetString(MSG_OUTOFMEMORY), __FUNC__, "ds->dsl_DskPtr", sizeof(struct DSList) * NDisk);
- myabort(15);
- }
-
- for (ds->dsl_MaxIndex=n=0; n<NDisk; n++)
- {
- m = Disks[n].valid ? n : NO_DRIVE;
-
- if (m != Exclude0 &&
- (DSX_ExcludeTape != Exclude || NULL == Disks[n].TapeReq) &&
- (DSX_ExcludeNull != Exclude || Disks[n].valid) )
- {
- ds->dsl_DskPtr[ds->dsl_MaxIndex].Dsk = &Disks[n];
- ds->dsl_DskPtr[ds->dsl_MaxIndex].Index = m;
-
- ds->dsl_MaxIndex++;
- }
- }
-
- // Device-Liste alphabetisch sortieren
- qsort((char *) ds->dsl_DskPtr, ds->dsl_MaxIndex, sizeof(struct DSList), DSCompare);
- }
-
-
- // Index des momentan ausgewählten Eintrages <SelectedIndex> in <ds> merken
- void SetSelectedDevice(short SelectedIndex, struct DevSel *ds)
- {
- short n;
-
- ds->dsl_MarkedIndex = ~0;
-
- for (n=0; n<ds->dsl_MaxIndex; n++)
- {
- struct DSList *dsl;
-
- dsl = &ds->dsl_DskPtr[n];
-
- dsl->ds_Node.ln_Name = dsl->Dsk->DOSName;
-
- if (!dsl->Dsk->valid)
- dsl->Image = &NoDriveImage;
- else if (NULL != dsl->Dsk->TapeReq)
- dsl->Image = &TapeDriveImage;
- else if (isDiskDeviceName(dsl->Dsk->DeviceName))
- dsl->Image = &DiskDriveImage;
- else
- dsl->Image = NULL;
-
- dsl->Record.alr_Flags = 0L;
-
- AddTail((struct List *) &ds->dsl_List, &dsl->ds_Node);
-
- if (dsl->Index == SelectedIndex)
- {
- dsl->Record.alr_Flags |= ALRF_SELECTED;
- ds->dsl_MarkedIndex = n;
- }
- }
-
- }
-
-
- void CleanupDeviceSelect(struct DevSel *ds)
- {
- if (ds->dsl_DskPtr)
- {
- free(ds->dsl_DskPtr);
- ds->dsl_DskPtr = NULL;
- ds->dsl_MaxIndex = 0l;
- }
- }
-
-
- // Vergleichsfunktion für qsort() zum Sortieren der Device-Liste
- static int DSCompare(const struct DSList *Dsk1, const struct DSList *Dsk2)
- {
- ASSERT_VALID(Dsk1);
- ASSERT_VALID(Dsk2);
-
- return stricmp(Dsk1->Dsk->DOSName, Dsk2->Dsk->DOSName);
- }
-
-
- // Suchen in DskPtr nach einem Device mit Namen <Name>. Liefert Index wenn gefunden
- // oder NO_DRIVE
- static short FindDskIndex(const char *Name)
- {
- short n;
-
- ASSERT_VALID(Name);
-
- for (n=0; n<MaxIndex; n++)
- {
- if (stricmp(DskPtr[n].Dsk->DOSName, Name) == 0)
- return n;
- }
-
- return NO_DRIVE;
- }
-
-
- static void NewDS(struct DevSel *ds, ULONG NewIndex)
- {
- NB_SetGadgetAttrs(*(ds->dsl_ListView), *(ds->dsl_NoteBook),
- GTLV_Selected, NewIndex,
- GTLV_MakeVisible, NewIndex,
- TAG_END);
-
- ds->dsl_MarkedIndex = NewIndex;
- }
-
-
- static ULONG __interrupt __saveds LVShowDevice(struct Hook *HookPtr,
- struct DSList *DevNode, struct LVDrawMsg *Msg )
- {
- ULONG len, Result = LVCB_UNKNOWN;
-
- if (LV_DRAW == Msg->lvdm_MethodID)
- {
- short FgColor, BgColor;
- char *lp;
- short TextX, x;
- short Height, y;
-
- Height = Msg->lvdm_Bounds.MaxY - Msg->lvdm_Bounds.MinY;
- y = Msg->lvdm_Bounds.MinY + (Height - NoDriveImage.Height) / 2;
-
- switch (Msg->lvdm_State)
- {
- case LVR_NORMAL:
- case LVR_NORMALDISABLED:
- FgColor = Msg->lvdm_DrawInfo->dri_Pens[TEXTPEN];
- BgColor = Msg->lvdm_DrawInfo->dri_Pens[BACKGROUNDPEN];
- break;
- case LVR_SELECTED:
- case LVR_SELECTEDDISABLED:
- FgColor = Msg->lvdm_DrawInfo->dri_Pens[FILLTEXTPEN];
- BgColor = Msg->lvdm_DrawInfo->dri_Pens[FILLPEN];
- break;
- }
-
- SetDrMd(Msg->lvdm_RastPort, JAM1);
- SetAPen(Msg->lvdm_RastPort, BgColor);
- RectFill(Msg->lvdm_RastPort,
- Msg->lvdm_Bounds.MinX, Msg->lvdm_Bounds.MinY,
- Msg->lvdm_Bounds.MaxX, Msg->lvdm_Bounds.MaxY);
-
- SetAPen(Msg->lvdm_RastPort, FgColor);
-
- if (DevNode->Image)
- {
- DrawImage(Msg->lvdm_RastPort, DevNode->Image,
- Msg->lvdm_Bounds.MinX + (MAX_IMAGE_WIDTH - DevNode->Image->Width) / 2,
- y + (MAX_IMAGE_HEIGHT - DevNode->Image->Height) / 2);
- }
-
- lp = DevNode->ds_Node.ln_Name;
- TextX = Msg->lvdm_Bounds.MinX + 4 + TapeDriveImage.Width;
- x = 0;
-
- while (lp && *lp)
- {
- struct TextExtent TxtExt;
- char *lpNext;
- size_t MaxLen;
-
- lpNext = strchr(lp, '\t');
- MaxLen = lpNext ? lpNext - lp : strlen(lp);
-
- Move(Msg->lvdm_RastPort, TextX + x,
- Msg->lvdm_Bounds.MinY + Msg->lvdm_RastPort->Font->tf_Baseline);
-
- len = TextFit(Msg->lvdm_RastPort,
- lp, MaxLen,
- &TxtExt, NULL, 1,
- Msg->lvdm_Bounds.MaxX - (TextX + x),
- 1 + Msg->lvdm_Bounds.MaxY - Msg->lvdm_Bounds.MinY );
-
- Text(Msg->lvdm_RastPort, lp, len);
-
- if (lpNext)
- {
- short n;
-
- x += TxtExt.te_Width;
-
- for (n=0; LVTabs[n] != ~0 && LVTabs[n] < x; )
- n++;
- if (~0 != LVTabs[n])
- x = LVTabs[n];
-
- lpNext++; // '\t' überspringen
- }
-
- lp = lpNext;
- }
-
- if (LVR_NORMALDISABLED == Msg->lvdm_State || LVR_SELECTEDDISABLED == Msg->lvdm_State)
- {
- static USHORT __chip DisabledPattern[] = { 0x4444, 0x1111 };
- struct RastPort rp;
-
- rp = *Msg->lvdm_RastPort;
- SetAfPt(&rp, DisabledPattern, 1);
- SetDrMd(&rp, JAM1);
- SetAPen(&rp, Msg->lvdm_DrawInfo->dri_Pens[TEXTPEN]);
-
- RectFill(&rp, Msg->lvdm_Bounds.MinX,
- Msg->lvdm_Bounds.MinY,
- Msg->lvdm_Bounds.MaxX,
- Msg->lvdm_Bounds.MaxY
- );
- }
-
- Result = LVCB_OK;
- }
-
- return Result;
- }
-
-
-
- static BOOL isDiskDeviceName(const char *DevName)
- {
- static const char *KnownDiskDevNames[] =
- {
- "trackdisk.device",
- "mfm.device",
- "diskspare.device",
- NULL,
- };
- short n;
-
- for (n=0; KnownDiskDevNames[n]; n++)
- {
- if (0 == strcmp(KnownDiskDevNames[n], DevName))
- return TRUE;
- }
-
- return FALSE;
- }
-
-
- void SetDevSelFromIndex(ULONG DriveIndex, struct DevSel *ds)
- {
- short n;
-
- // Index des momentan ausgewählten Eintrages suchen
- for (n=0; n<ds->dsl_MaxIndex; n++)
- {
- if (ds->dsl_DskPtr[n].Index == DriveIndex)
- {
- ds->dsl_MarkedIndex = n;
- return;
- }
- }
- }
-